/**
 * Url get参数获取
 * @param  {string} par 参数名
 * @return {object}     参数值
 */
function getUrlParam(par){
    //获取当前URL
    var local_url = document.location.href; 
    //获取要取得的get参数位置
    var get = local_url.indexOf(par +"=");
    if(get == -1){
        return false;   
    }   
    //截取字符串
    var get_par = local_url.slice(par.length + get + 1);    
    //判断截取后的字符串是否还有其他get参数
    var nextPar = get_par.indexOf("&");
    if(nextPar != -1){
        get_par = get_par.slice(0, nextPar);
    }
    return get_par;
}

/**
 * http-get参数转为对象
 * @param  string   params
 * @return object
 */
function httpToObject(params){
    var params  = params.split('&');
    var object  = {};
    for(var i in params){
        var param   = params[i];
        param   = param.split('=');
        object[param[0]]    = param[1];
    }
    return object;
}

/**
 * 对象转为http-get字符串
 * @param {object} object 目标对象
 * @return {string} [description]
 */
function objectToHttp(object){
    var string  = '';
    for(var i in object){
        string  = string + i + '=' + object[i] + '&';
    }
    string  = string.substring(0, string.length-1);
    return string;
}

/**
 * 复杂对象转为get参数
 * date
 * @param  {[type]} param  [description]
 * @param  {[type]} key    [description]
 * @param  {[type]} encode [description]
 * @return {[type]}        [description]
 */
function httpBuildQuery(param, key, encode){
    if(param==null) return '';
    var paramStr = '';
    var t = typeof (param);
    if (t == 'string' || t == 'number' || t == 'boolean') {
        paramStr += '&' + key + '=' + ((encode==null||encode) ? encodeURIComponent(param) : param);
    } else {
        for (var i in param) {
            var k = key == null ? i : key + '[' + i + ']';
            paramStr += httpBuildQuery(param[i], k, encode);
        }
    }
    return paramStr;
}

/**
 * 本地缓存读取
 * @param {string} key 键名
 * @param {object} val 键值
 */
function S(key, val){
    key     = config.cache_prefix + key;
    if(val){
        sessionStorage.setItem(key, JSON.stringify(val));
    }
    if(val === null){
        sessionStorage.removeItem(key);
    }
    return JSON.parse(sessionStorage.getItem(key));
}

/**
 * 本地长久数据读取
 * @param {string} key 键名
 * @param {object} val 键值
 */
function D(key, val){
    key     = config.prefix_data + key;
    if(val){
        localStorage.setItem(key, JSON.stringify(val));
    }
    if(val === null){
        alert('run');
        localStorage.removeItem(key);
    }
    return JSON.parse(localStorage.getItem(key));
}


var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
/** 
 * base64编码 
 * @param {Object} str 
 */  
function base64encode(str){  
    var out, i, len;  
    var c1, c2, c3;  
    len = str.length;  
    i = 0;  
    out = "";  
    while (i < len) {  
        c1 = str.charCodeAt(i++) & 0xff;  
        if (i == len) {  
            out += base64EncodeChars.charAt(c1 >> 2);  
            out += base64EncodeChars.charAt((c1 & 0x3) << 4);  
            out += "==";  
            break;  
        }  
        c2 = str.charCodeAt(i++);  
        if (i == len) {  
            out += base64EncodeChars.charAt(c1 >> 2);  
            out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));  
            out += base64EncodeChars.charAt((c2 & 0xF) << 2);  
            out += "=";  
            break;  
        }  
        c3 = str.charCodeAt(i++);  
        out += base64EncodeChars.charAt(c1 >> 2);  
        out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));  
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));  
        out += base64EncodeChars.charAt(c3 & 0x3F);  
    }  
    return out;  
}  
/** 
 * base64解码 
 * @param {Object} str 
 */  
function base64decode(str){  
    var c1, c2, c3, c4;  
    var i, len, out;  
    len = str.length;  
    i = 0;  
    out = "";  
    while (i < len) {  
        /* c1 */  
        do {  
            c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];  
        }  
        while (i < len && c1 == -1);  
        if (c1 == -1)   
            break;  
        /* c2 */  
        do {  
            c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];  
        }  
        while (i < len && c2 == -1);  
        if (c2 == -1)   
            break;  
        out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));  
        /* c3 */  
        do {  
            c3 = str.charCodeAt(i++) & 0xff;  
            if (c3 == 61)   
                return out;  
            c3 = base64DecodeChars[c3];  
        }  
        while (i < len && c3 == -1);  
        if (c3 == -1)   
            break;  
        out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));  
        /* c4 */  
        do {  
            c4 = str.charCodeAt(i++) & 0xff;  
            if (c4 == 61)   
                return out;  
            c4 = base64DecodeChars[c4];  
        }  
        while (i < len && c4 == -1);  
        if (c4 == -1)   
            break;  
        out += String.fromCharCode(((c3 & 0x03) << 6) | c4);  
    }  
    return out;  
}

//缓存应用
function Cache(){
    var sql     = window.sessionStorage;

    //获取时间戳
    this.get_time   = function(){
        return Math.round((new Date()).valueOf()/1000);
    }

    //设置缓存
    this.set_cache  = function(key, val, expire){
        if(!key)    return false;
        if(!val)    return false;
        if(!expire) expire  = config.cache_time;

        var cache_key     = config.cache_prefix + key;
        var expire_key  = key + '_expire';

        sql.setItem(cache_key, JSON.stringify(val));
        //判断是否为有效时间
        if(!isNaN(expire))
            sql.setItem(expire_key, this.get_time() + expire);
    }

    //获取缓存
    this.get_cache  = function(key){
        if(!key)    return false;

        var cache_key     = config.cache_prefix + key;
        //检测过期时间
        var expire_key  = key + '_expire';
        var expire_time     = sql.getItem(expire_key);
        if(expire_time && expire_time < this.get_time()){
            this.remove_cache(cache_key);
            return false;
        }

        return  JSON.parse(sql.getItem(cache_key));
    }

    //清除缓存
    this.remove_cache   = function(key){
        if(!key)    return false;

        var cache_key   = config.cache_prefix + key;
        sql.removeItem(cache_key);
    }
}
var Cache   = new Cache();